#include "widget.h"
#include"base1.h"
#include<QIcon>
#include<QPainter>
#include<map.h>
#include <zhu.h>
#include"bullet.h"
#include<ctime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //调用初始化场景
    initScene();
    //启动游戏
    playGame();
}

Widget::~Widget()
{
}

void Widget::initScene()
{
    //设置窗口尺寸
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);

    //设置标题
    setWindowTitle(GAME_TITLE);

    //加载图标
    setWindowIcon(QIcon(GAME_ICON));

    //定时器设置
    m_Timer.setInterval(GAME_RATE);

    //敌机出场时间间隔
    m_recorder=0;

    //随机数种子
    srand((unsigned int)time(NULL));
}

void Widget::playGame()//信号槽
{
    //启动计时器
    m_Timer.start();

    //监听定时器发送的信号
    connect(&m_Timer,&QTimer::timeout,[=](){
        //更新游戏中元素的坐标
        updatePosition();
        //绘制到屏幕中
        update();
        //敌机出场
        enemyshow();
        //碰撞检测
        pengzhuang();
    });
}

void Widget::updatePosition()
{
    //更新地图的坐标
    m_map.mapPosition();

    //发射子弹
    m_zhu.shoot();

    //计算所有非空闲子弹的当前坐标
    for(int i=0;i<BULLET_NUM;i++)
    {
        //如果非空闲,计算发射位置
        if(m_zhu.m_bullets[i].m_free==false)
        {
            m_zhu.m_bullets[i].updatePosition();
        }

    }

    //敌机出场
    for(int i=0;i<ENEMY_NUM;i++)
    {
        if(!m_enemys[i].m_free)
        {
          m_enemys[i].updatePosition();
        }
    }

    //计算爆炸播放的图片
    for(int i=0;i<BOOM_NUM;i++)
    {
        if(m_booms[i].m_free==false)
        {
            m_booms[i].updateinfo();
        }
    }

}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    //绘制地图
    painter.drawPixmap(0,m_map.m_map1_posY,m_map.m_map1);
    painter.drawPixmap(0,m_map.m_map2_posY,m_map.m_map2);

    //绘制主角飞机
    painter.drawPixmap(m_zhu.m_x,m_zhu.m_y,m_zhu.m_plane);

    //绘制子弹
    for(int i=0;i<BULLET_NUM;i++)
    {

        //如果非空闲，绘制
        if(m_zhu.m_bullets[i].m_free==false)
        {
             painter.drawPixmap(m_zhu.m_bullets[i].m_x,m_zhu.m_bullets[i].m_y,m_zhu.m_bullets[i].m_Bullet);
        }
    }
    //绘制敌机

    for(int i=0;i<ENEMY_NUM;i++)
    {
        if(!m_enemys[i].m_free)
        {
            painter.drawPixmap(m_enemys[i].m_x,m_enemys[i].m_y,m_enemys[i].m_enemy);
        }
    }
    //绘制爆炸图片
    for(int i=0;i<BOOM_NUM;i++)
    {
        if(m_booms[i].m_free==false)
        {
            painter.drawPixmap(m_booms[i].m_x,m_booms[i].m_y,m_booms[i].m_pixarr[m_booms[i].m_index]);

        }
         painter.drawPixmap(m_booms[i].m_x,m_booms[i].m_y,QPixmap(REWARD_MONEY));
    }
    //绘制心
    painter.drawPixmap(0,0,QPixmap(LIFE));

    //显示心数
    //显示积分数


    //如果游戏结束，绘制游戏结束界面

}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    int x=event->x()-m_zhu.m_Rect.width()*0.5;
    int y=event->y()-m_zhu.m_Rect.height()*0.5;

    //边界检测
    if(x<0){
        x=0;
    }
    if(x>=GAME_WIDTH-m_zhu.m_Rect.width()){
        x=GAME_WIDTH-m_zhu.m_Rect.width();
    }
    if(y<0){
         y=0;
    }
    if(y>=GAME_HEIGHT-m_zhu.m_Rect.height()){
        y=GAME_HEIGHT-m_zhu.m_Rect.height();
    }

    //不需要拖拽操作
    setMouseTracking(true);
    m_zhu.setPosition(x,y);
}

void Widget::enemyshow()
{
    m_recorder++;
    //未到出场时间
    if(m_recorder<ENEMY_INTERVAL)
    {
        return;
    }
    m_recorder=0;
    for(int i=0;i<ENEMY_NUM;i++)
    {
        //是空闲敌机，出场
        if(m_enemys[i].m_free)
        {
            m_enemys[i].m_free=false;

            //坐标
            m_enemys[i].m_x=rand()%(GAME_WIDTH-m_enemys[i].m_Rect.width());;
            m_enemys[i].m_y=-m_enemys[i].m_Rect.height();
            break;
        }

    }

}

void Widget::pengzhuang()
{
    //历遍所有非空闲的敌机
    for(int i=0;i<ENEMY_NUM;i++)
    {
        //空闲飞机执行下一次循环
        if(m_enemys[i].m_free)
        {
            continue;
        }
        //历遍所有非空闲的子弹
        for(int j=0;j<BULLET_NUM;j++)
        {
            //敌机与主机碰撞
            if(m_enemys[i].m_Rect.intersects(m_zhu.m_Rect))
            {
                m_zhu.m_life--;
                if(m_zhu.m_life==0){
                m_Timer.stop();
                game=true;
                this->close();
                }


            }

            //空闲子弹继续下次
            if(m_zhu.m_bullets[j].m_free)
            {
                continue;
            }
            //如果判断碰撞为真，则二者同时设置为真
            if(m_enemys[i].m_Rect.intersects(m_zhu.m_bullets[j].m_Rect))
            {
                m_zhu.score+=10;
                m_enemys[i].m_free=true;
                m_zhu.m_bullets[j].m_free=true;

                //播放爆炸效果
                for(int k=0;k<BOOM_NUM;k++)
                {
                    if(m_booms[k].m_free)
                    {
                        m_booms[k].m_free=false;

                        //更新坐标
                        m_booms[k].m_x=m_enemys[i].m_x+m_enemys[i].m_Rect.width()*0.3;
                        m_booms[k].m_y=m_enemys[i].m_y+m_enemys[i].m_Rect.height()*0.3;
                        break;
                    }
                }
            }



        }


    }
}
